home *** CD-ROM | disk | FTP | other *** search
/ Programming a Multiplayer FPS in DirectX / Programming a Multiplayer FPS in DirectX (Companion CD).iso / DirectX / dxsdk_oct2004.exe / dxsdk.exe / Utilities / MView / gxu / crackdecl.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2004-09-27  |  12.5 KB  |  374 lines

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  Copyright (C) 2000 Microsoft Corporation.  All Rights Reserved.
  4. //
  5. //  File:       crackdecl.cpp
  6. //  Content:    Used to access vertex data using Declarations 
  7. //  Updated Oct 16, 2001 to decode DX9 decls
  8. //
  9. //////////////////////////////////////////////////////////////////////////////
  10.  
  11. #include "pchgxu.h"
  12. #include "crackdecl.h"
  13.  
  14.  
  15. //----------------------------------------------------------------------------
  16. // CD3DXCrackDecl methods
  17. //----------------------------------------------------------------------------
  18.  
  19. CD3DXCrackDecl::CD3DXCrackDecl()
  20. {
  21.     for(UINT i = 0; i < 16; i++)
  22.     {
  23.         dwStride[i] = 0;
  24.     }
  25. }
  26.  
  27.  
  28. HRESULT 
  29. CD3DXCrackDecl::SetDeclaration(CONST D3DVERTEXELEMENT9 *pDecl)
  30. {
  31.     pElements = pDecl;
  32.     dwNumElements = D3DXGetDeclLength(pDecl);
  33.      return S_OK;
  34. }
  35.  
  36.  
  37. HRESULT 
  38. CD3DXCrackDecl::SetStreamSource(UINT Stream, LPVOID pData, UINT Stride)
  39. {
  40.  
  41.     pStream[Stream]   = (LPBYTE) pData;
  42.     if(Stride == 0)
  43.         dwStride[Stream] = D3DXGetDeclVertexSize(pElements,Stream);
  44.     else
  45.         dwStride[Stream] = Stride;
  46.  
  47.     return S_OK;
  48. }
  49.  
  50.  
  51. VOID 
  52. CD3DXCrackDecl::Decode(CONST D3DVERTEXELEMENT9 *pElem, UINT index,FLOAT* pData, UINT cData)
  53. {
  54.     FLOAT Data[4];
  55.  
  56.     if(pElem)
  57.     {
  58.         LPVOID pElement = GetElementPointer(pElem,index);
  59.  
  60.         switch(pElem->Type)
  61.         {
  62.         case D3DDECLTYPE_FLOAT1:
  63.             Data[0] = ((FLOAT *) pElement)[0];
  64.             Data[1] = 0.0f;
  65.             Data[2] = 0.0f;
  66.             Data[3] = 1.0f;
  67.             break;
  68.  
  69.         case D3DDECLTYPE_FLOAT2:
  70.             Data[0] = ((FLOAT *) pElement)[0];
  71.             Data[1] = ((FLOAT *) pElement)[1];
  72.             Data[2] = 0.0f;
  73.             Data[3] = 1.0f;
  74.             break;
  75.  
  76.         case D3DDECLTYPE_FLOAT3:
  77.             Data[0] = ((FLOAT *) pElement)[0];
  78.             Data[1] = ((FLOAT *) pElement)[1];
  79.             Data[2] = ((FLOAT *) pElement)[2];
  80.             Data[3] = 1.0f;
  81.             break;
  82.  
  83.         case D3DDECLTYPE_FLOAT4:
  84.             Data[0] = ((FLOAT *) pElement)[0];
  85.             Data[1] = ((FLOAT *) pElement)[1];
  86.             Data[2] = ((FLOAT *) pElement)[2];
  87.             Data[3] = ((FLOAT *) pElement)[3];
  88.             break;
  89.  
  90.         case D3DDECLTYPE_D3DCOLOR:
  91.             Data[0] = (1.0f / 255.0f) * (FLOAT) (UINT8) (*((D3DCOLOR *) pElement) >> 16);
  92.             Data[1] = (1.0f / 255.0f) * (FLOAT) (UINT8) (*((D3DCOLOR *) pElement) >>  8);
  93.             Data[2] = (1.0f / 255.0f) * (FLOAT) (UINT8) (*((D3DCOLOR *) pElement) >>  0);
  94.             Data[3] = (1.0f / 255.0f) * (FLOAT) (UINT8) (*((D3DCOLOR *) pElement) >> 24);
  95.             break;
  96.  
  97.         case D3DDECLTYPE_UBYTE4:
  98.             Data[0] = (FLOAT) ((UINT8 *) pElement)[0];
  99.             Data[1] = (FLOAT) ((UINT8 *) pElement)[1];
  100.             Data[2] = (FLOAT) ((UINT8 *) pElement)[2];
  101.             Data[3] = (FLOAT) ((UINT8 *) pElement)[3];
  102.             break;
  103.  
  104.         case D3DDECLTYPE_SHORT2:
  105.             Data[0] = (FLOAT) ((INT16 *) pElement)[0];
  106.             Data[1] = (FLOAT) ((INT16 *) pElement)[1];
  107.             Data[2] = 0.0f;
  108.             Data[3] = 1.0f;
  109.             break;
  110.  
  111.         case D3DDECLTYPE_SHORT4:
  112.             Data[0] = (FLOAT) ((INT16 *) pElement)[0];
  113.             Data[1] = (FLOAT) ((INT16 *) pElement)[1];
  114.             Data[2] = (FLOAT) ((INT16 *) pElement)[2];
  115.             Data[3] = (FLOAT) ((INT16 *) pElement)[3];
  116.             break;
  117.  
  118.         case D3DDECLTYPE_UBYTE4N:
  119.             Data[0] = (1.0f / 255.0f) * (FLOAT) (((UINT8 *) pElement)[0]);
  120.             Data[1] = (1.0f / 255.0f) * (FLOAT) (((UINT8 *) pElement)[1]);
  121.             Data[2] = (1.0f / 255.0f) * (FLOAT) (((UINT8 *) pElement)[2]);
  122.             Data[3] = (1.0f / 255.0f) * (FLOAT) (((UINT8 *) pElement)[3]);
  123.             break;
  124.             
  125.         case D3DDECLTYPE_SHORT2N:
  126.             {
  127.                 INT16 nX = (((INT16 *) pElement)[0]);
  128.                 INT16 nY = (((INT16 *) pElement)[1]);
  129.  
  130.                 nX += (-32768 == nX);
  131.                 nY += (-32768 == nY);
  132.  
  133.                 Data[0] = (1.0f / 32767.0f) * (FLOAT) nX;
  134.                 Data[1] = (1.0f / 32767.0f) * (FLOAT) nY;
  135.                 Data[2] = 0.0f;
  136.                 Data[3] = 1.0f;
  137.             }
  138.             break;
  139.  
  140.         case D3DDECLTYPE_SHORT4N:
  141.             {
  142.                 INT16 nX = (((INT16 *) pElement)[0]);
  143.                 INT16 nY = (((INT16 *) pElement)[1]);
  144.                 INT16 nZ = (((INT16 *) pElement)[2]);
  145.                 INT16 nW = (((INT16 *) pElement)[3]);
  146.  
  147.                 nX += (-32768 == nX);
  148.                 nY += (-32768 == nY);
  149.                 nZ += (-32768 == nZ);
  150.                 nW += (-32768 == nW);
  151.  
  152.                 Data[0] = (1.0f / 32767.0f) * (FLOAT) nX;
  153.                 Data[1] = (1.0f / 32767.0f) * (FLOAT) nY;
  154.                 Data[2] = (1.0f / 32767.0f) * (FLOAT) nZ;
  155.                 Data[3] = (1.0f / 32767.0f) * (FLOAT) nW;
  156.             }
  157.             break;
  158.  
  159.         case D3DDECLTYPE_USHORT2N:
  160.             Data[0] = (1.0f / 65535.0f) * (FLOAT) (((UINT16 *) pElement)[0]);
  161.             Data[1] = (1.0f / 65535.0f) * (FLOAT) (((UINT16 *) pElement)[1]);
  162.             Data[2] = 0.0f;
  163.             Data[3] = 1.0f;
  164.             break;
  165.  
  166.         case D3DDECLTYPE_USHORT4N:
  167.             Data[0] = (1.0f / 65535.0f) * (FLOAT) (((UINT16 *) pElement)[0]);
  168.             Data[1] = (1.0f / 65535.0f) * (FLOAT) (((UINT16 *) pElement)[1]);
  169.             Data[2] = (1.0f / 65535.0f) * (FLOAT) (((UINT16 *) pElement)[2]);
  170.             Data[3] = (1.0f / 65535.0f) * (FLOAT) (((UINT16 *) pElement)[3]);
  171.             break;
  172.  
  173.         case D3DDECLTYPE_UDEC3:
  174.             Data[0] = (FLOAT) ((*((UINT32 *) pElement) >>  0) & 0x3ff);
  175.             Data[1] = (FLOAT) ((*((UINT32 *) pElement) >> 10) & 0x3ff);
  176.             Data[2] = (FLOAT) ((*((UINT32 *) pElement) >> 20) & 0x3ff);
  177.             Data[3] = 1.0f;
  178.             break;
  179.  
  180.         case D3DDECLTYPE_DEC3N:
  181.             {
  182.                 INT32 nX = ((*((INT32 *) pElement) << 22)) >> 22;
  183.                 INT32 nY = ((*((INT32 *) pElement) << 12)) >> 22;
  184.                 INT32 nZ = ((*((INT32 *) pElement) <<  2)) >> 22;
  185.  
  186.                 nX += (-512 == nX);
  187.                 nY += (-512 == nY);
  188.                 nZ += (-512 == nZ);
  189.  
  190.                 Data[0] = (1.0f / 511.0f) * (FLOAT) nX;
  191.                 Data[1] = (1.0f / 511.0f) * (FLOAT) nY;
  192.                 Data[2] = (1.0f / 511.0f) * (FLOAT) nZ;
  193.                 Data[3] = 1.0f;
  194.             }
  195.             break;
  196.         case D3DDECLTYPE_FLOAT16_2:
  197.             D3DXFloat16To32Array(Data,(D3DXFLOAT16*)pElement,2);
  198.             Data[2] = 0.0f;
  199.             Data[3] = 1.0f;           
  200.             break;
  201.         case D3DDECLTYPE_FLOAT16_4:
  202.             D3DXFloat16To32Array(Data,(D3DXFLOAT16*)pElement,4);
  203.             break;
  204.         }
  205.     }
  206.     else
  207.     {
  208.         Data[0] = 0.0f;
  209.         Data[1] = 0.0f;
  210.         Data[2] = 0.0f;
  211.         Data[3] = 1.0f;
  212.     }
  213.  
  214.     if(cData > 4)
  215.         cData = 4;
  216.  
  217.     for(UINT i = 0; i < cData; i++)
  218.         pData[i] = Data[i];
  219. }
  220.  
  221.  
  222. VOID 
  223. CD3DXCrackDecl::Encode(CONST D3DVERTEXELEMENT9 *pElem, UINT index,CONST FLOAT* pData, UINT cData)
  224. {
  225.     UINT i = 0;
  226.     FLOAT Data[4];
  227.  
  228.     if(cData > 4)
  229.         cData = 4;
  230.  
  231.     switch(pElem->Type)
  232.     {
  233.     case D3DDECLTYPE_D3DCOLOR:
  234.     case D3DDECLTYPE_UBYTE4N:
  235.     case D3DDECLTYPE_USHORT2N:
  236.     case D3DDECLTYPE_USHORT4N:
  237.         for(; i < cData; i++)
  238.             Data[i] = (0.0f > pData[i]) ? 0.0f : ((1.0f < pData[i]) ? 1.0f : pData[i]);
  239.         break;                    
  240.  
  241.     case D3DDECLTYPE_SHORT2N:
  242.     case D3DDECLTYPE_SHORT4N:
  243.     case D3DDECLTYPE_DEC3N:
  244.         for(; i < cData; i++)
  245.             Data[i] = (-1.0f > pData[i]) ? -1.0f : ((1.0f < pData[i]) ? 1.0f : pData[i]);
  246.         break;                    
  247.  
  248.     case D3DDECLTYPE_UBYTE4:
  249.     case D3DDECLTYPE_UDEC3:
  250.         for(; i < cData; i++)
  251.             Data[i] = (0.0f > pData[i]) ? 0.0f : pData[i];
  252.         break;                    
  253.  
  254.     default:
  255.         for(; i < cData; i++)
  256.             Data[i] = pData[i];
  257.         break;
  258.     }
  259.  
  260.     for(; i < 3; i++)
  261.         Data[i] = 0.0f;
  262.  
  263.     for(; i < 4; i++)
  264.         Data[i] = 1.0f;
  265.  
  266.     if(pElem)
  267.     {
  268.         LPVOID pElement = GetElementPointer(pElem,index);
  269.  
  270.         switch(pElem->Type)
  271.         {
  272.         case D3DDECLTYPE_FLOAT1:
  273.             ((FLOAT *) pElement)[0] = Data[0];
  274.             break;
  275.  
  276.         case D3DDECLTYPE_FLOAT2:
  277.             ((FLOAT *) pElement)[0] = Data[0];
  278.             ((FLOAT *) pElement)[1] = Data[1];
  279.             break;
  280.  
  281.         case D3DDECLTYPE_FLOAT3:
  282.             ((FLOAT *) pElement)[0] = Data[0];
  283.             ((FLOAT *) pElement)[1] = Data[1];
  284.             ((FLOAT *) pElement)[2] = Data[2];
  285.             break;
  286.  
  287.         case D3DDECLTYPE_FLOAT4:
  288.             ((FLOAT *) pElement)[0] = Data[0];
  289.             ((FLOAT *) pElement)[1] = Data[1];
  290.             ((FLOAT *) pElement)[2] = Data[2];
  291.             ((FLOAT *) pElement)[3] = Data[3];
  292.             break;
  293.  
  294.         case D3DDECLTYPE_D3DCOLOR:
  295.             ((D3DCOLOR *) pElement)[0] = 
  296.                 (((D3DCOLOR) (Data[0] * 255.0f + 0.5f) & 0xff) << 16) |
  297.                 (((D3DCOLOR) (Data[1] * 255.0f + 0.5f) & 0xff) <<  8) |
  298.                 (((D3DCOLOR) (Data[2] * 255.0f + 0.5f) & 0xff) <<  0) |
  299.                 (((D3DCOLOR) (Data[3] * 255.0f + 0.5f) & 0xff) << 24);
  300.             break;                    
  301.  
  302.         case D3DDECLTYPE_UBYTE4:
  303.             ((UINT8 *) pElement)[0] = (UINT8) (Data[0] + 0.5f);
  304.             ((UINT8 *) pElement)[1] = (UINT8) (Data[1] + 0.5f);
  305.             ((UINT8 *) pElement)[2] = (UINT8) (Data[2] + 0.5f);
  306.             ((UINT8 *) pElement)[3] = (UINT8) (Data[3] + 0.5f);
  307.             break;
  308.  
  309.         case D3DDECLTYPE_SHORT2:
  310.             ((INT16 *) pElement)[0] = (INT16) (Data[0] + 0.5f);
  311.             ((INT16 *) pElement)[1] = (INT16) (Data[1] + 0.5f);
  312.             break;
  313.  
  314.         case D3DDECLTYPE_SHORT4:
  315.             ((INT16 *) pElement)[0] = (INT16) (Data[0] + 0.5f);
  316.             ((INT16 *) pElement)[1] = (INT16) (Data[1] + 0.5f);
  317.             ((INT16 *) pElement)[2] = (INT16) (Data[2] + 0.5f);
  318.             ((INT16 *) pElement)[3] = (INT16) (Data[3] + 0.5f);
  319.             break;
  320.  
  321.         case D3DDECLTYPE_UBYTE4N:
  322.             ((UINT8 *) pElement)[0] = (UINT8) (Data[0] * 255.0f + 0.5f);
  323.             ((UINT8 *) pElement)[1] = (UINT8) (Data[1] * 255.0f + 0.5f);
  324.             ((UINT8 *) pElement)[2] = (UINT8) (Data[2] * 255.0f + 0.5f);
  325.             ((UINT8 *) pElement)[3] = (UINT8) (Data[3] * 255.0f + 0.5f);
  326.             break;
  327.  
  328.         case D3DDECLTYPE_SHORT2N:
  329.             ((INT16 *) pElement)[0] = (INT16) (Data[0] * 32767.0f + 0.5f);
  330.             ((INT16 *) pElement)[1] = (INT16) (Data[1] * 32767.0f + 0.5f);
  331.             break;
  332.  
  333.         case D3DDECLTYPE_SHORT4N:
  334.             ((INT16 *) pElement)[0] = (INT16) (Data[0] * 32767.0f + 0.5f);
  335.             ((INT16 *) pElement)[1] = (INT16) (Data[1] * 32767.0f + 0.5f);
  336.             ((INT16 *) pElement)[2] = (INT16) (Data[2] * 32767.0f + 0.5f);
  337.             ((INT16 *) pElement)[3] = (INT16) (Data[3] * 32767.0f + 0.5f);
  338.             break;
  339.  
  340.         case D3DDECLTYPE_USHORT2N:
  341.             ((UINT16 *) pElement)[0] = (UINT16) (Data[0] * 65535.0f + 0.5f);
  342.             ((UINT16 *) pElement)[1] = (UINT16) (Data[1] * 65535.0f + 0.5f);
  343.             break;
  344.  
  345.         case D3DDECLTYPE_USHORT4N:
  346.             ((UINT16 *) pElement)[0] = (UINT16) (Data[0] * 65535.0f + 0.5f);
  347.             ((UINT16 *) pElement)[1] = (UINT16) (Data[1] * 65535.0f + 0.5f);
  348.             ((UINT16 *) pElement)[2] = (UINT16) (Data[2] * 65535.0f + 0.5f);
  349.             ((UINT16 *) pElement)[3] = (UINT16) (Data[3] * 65535.0f + 0.5f);
  350.             break;
  351.  
  352.         case D3DDECLTYPE_UDEC3:
  353.             ((UINT32 *) pElement)[0] = 
  354.                 (((UINT32) (Data[0] + 0.5f) & 0x3ff) <<  0) |
  355.                 (((UINT32) (Data[1] + 0.5f) & 0x3ff) << 10) |
  356.                 (((UINT32) (Data[2] + 0.5f) & 0x3ff) << 20); 
  357.             break;                    
  358.  
  359.         case D3DDECLTYPE_DEC3N:
  360.             ((UINT32 *) pElement)[0] = 
  361.                 (((UINT32) (Data[0] * 511.0f + 0.5f) & 0x3ff) <<  0) |
  362.                 (((UINT32) (Data[1] * 511.0f + 0.5f) & 0x3ff) << 10) |
  363.                 (((UINT32) (Data[2] * 511.0f + 0.5f) & 0x3ff) << 20); 
  364.             break;                  
  365.         case D3DDECLTYPE_FLOAT16_2:
  366.             D3DXFloat32To16Array((D3DXFLOAT16*)pElement,Data,2);
  367.             break;
  368.         case D3DDECLTYPE_FLOAT16_4:
  369.             D3DXFloat32To16Array((D3DXFLOAT16*)pElement,Data,4);
  370.             break;
  371.         }
  372.     }
  373. }
  374.